package telas.componentes;

import javax.swing.JDialog;
import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.border.EtchedBorder;
import javax.swing.JScrollPane;
import business.sistema.ExceptionSistema;
import business.sistema.IObjetoSistema;
import business.util.Menssagens;
import business.util.PropriedadeExtraTexto;

public class Localizador extends JDialog 
{
	private static final long serialVersionUID = 7178024514047080798L;
	private Painel pnlPrincipal = null;
	private Botao btnPerquisar = null;
	private CampoTexto txtCriterio = null;
	private Painel pnlCriterio = null;
	private Rotulo lblCriterio = null;
	private JScrollPane pnlGridPesquisa = null;
	private Tabela gridPesquisa = null;
	private Painel pnlBotoes = null;
	private Botao btnSelecionar = null;
	private Botao btnCancelar = null;
	private IObjetoSistema objeto = null;
	private ArrayList<IObjetoSistema> listaObjetos = null; 
	private String campoPesquisa;  //  @jve:decl-index=0:
	private String filtro = "";  //  @jve:decl-index=0:
	private ArrayList<String[]> formatoGrid;
	private CampoPopupLocalizador proprietario = null;
	
	/**
	 * This method initializes 
	 * 
	 */
	public Localizador(IObjetoSistema objeto, 
						String campoPesquisa, 
						ArrayList<String[]> formatoGrid,
						String descricaoPesquisa,
						CampoPopupLocalizador proprietario,
						String filtro) 
	{
		super();
		this.objeto = objeto;
		this.campoPesquisa = campoPesquisa;
		this.formatoGrid = formatoGrid;
		getLblCriterio().setText(descricaoPesquisa);
		this.proprietario = proprietario;
		this.filtro = filtro;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() 
	{
        this.setBounds(200, 200, 594, 436);
        this.setResizable(false);
        this.setModal(true);
        this.setContentPane(getPnlPrincipal());
        this.setTitle("Pesquisar");
        this.setVisible(true);
	}

	/**
	 * This method initializes pnlPrincipal	
	 * 	
	 * @return javax.swing.JPanel
	 */
	private Painel getPnlPrincipal() 
	{
		if (pnlPrincipal == null) 
		{
			pnlPrincipal = new Painel();
			pnlPrincipal.setLayout(new BorderLayout());
			pnlPrincipal.add(getPnlCriterio(), BorderLayout.NORTH);
			pnlPrincipal.add(getPnlGridPesquisa(), BorderLayout.CENTER);
			pnlPrincipal.add(getPnlBotoes(), BorderLayout.SOUTH);
		}
		return pnlPrincipal;
	}

	/**
	 * This method initializes btnPerquisar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private Botao getBtnPerquisar() 
	{
		if (btnPerquisar == null) 
		{
			btnPerquisar = new Botao();
			btnPerquisar.setText("Pesquisar");
			btnPerquisar.setBounds(new Rectangle(357, 33, 120, 25));
			
			btnPerquisar.addActionListener
			(
				new java.awt.event.ActionListener() 
				{	
					public void actionPerformed(java.awt.event.ActionEvent e) 
					{
						try
						{
							pesquisar();
						}
						catch(Exception ex)
						{
							new ExceptionSistema(ex);
						}
					}
				}
			);
		}
		return btnPerquisar;
	}

	/**
	 * This method initializes txtCriterio	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private CampoTexto getTxtCriterio() 
	{
		if (txtCriterio == null) 
		{
			txtCriterio = new CampoTexto();
			txtCriterio.setBounds(new Rectangle(8, 36, 348, 20));
			txtCriterio.setDocument(new PropriedadeExtraTexto(0, true));
			
			txtCriterio.addKeyListener
			(
				new java.awt.event.KeyAdapter() 
				{
					public void keyTyped(java.awt.event.KeyEvent e) 
					{
						txtCriterio.verificaTecla(e);
						
						// Verifica se é a tecla <ENTER>
						if(e.getKeyChar() == '\n')
						{
							getBtnPerquisar().doClick();
						}
					}
				}
			);
		}
		return txtCriterio;
	}
	
	

	/**
	 * This method initializes pnlCriterio	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private Painel getPnlCriterio() 
	{
		if (pnlCriterio == null) 
		{
			pnlCriterio = new Painel();
			pnlCriterio.setLayout(null);
			pnlCriterio.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
			pnlCriterio.setPreferredSize(new java.awt.Dimension(0, 70));
			pnlCriterio.add(getBtnPerquisar(), null);
			pnlCriterio.add(getTxtCriterio(), null);
			pnlCriterio.add(getLblCriterio(), null);
		}
		return pnlCriterio;
	}

	/**
	 * This method initializes pnlGridPesquisa	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getPnlGridPesquisa() {
		if (pnlGridPesquisa == null) {
			pnlGridPesquisa = new JScrollPane();
			pnlGridPesquisa.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
			pnlGridPesquisa.setViewportView(getGridPesquisa());
		}
		return pnlGridPesquisa;
	}

	/**
	 * This method initializes gridPesquisa	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private Tabela getGridPesquisa() 
	{
		if (gridPesquisa == null) 
		{
			gridPesquisa = new Tabela();
			gridPesquisa.addKeyListener
			(
				new java.awt.event.KeyAdapter() 
				{
					public void keyPressed(java.awt.event.KeyEvent e) 
					{
						if(e.getKeyChar() == '\n')
						{
							getBtnSelecionar().doClick();
						}
					}
				}
			);
			gridPesquisa.setFillsViewportHeight(true);
		}
		
		return gridPesquisa;
	}

	/**
	 * This method initializes pnlBotoes	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private Painel getPnlBotoes() 
	{
		if (pnlBotoes == null) 
		{
			pnlBotoes = new Painel();
			pnlBotoes.setLayout(null);
			pnlBotoes.setPreferredSize(new Dimension(0, 30));
			pnlBotoes.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
			pnlBotoes.add(getBtnSelecionar(), null);
			pnlBotoes.add(getBtnCancelar(), null);
		}
		
		return pnlBotoes;
	}

	/**
	 * This method initializes btnSelecionar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private Botao getBtnSelecionar() 
	{
		if (btnSelecionar == null) 
		{
			btnSelecionar = new Botao();
			btnSelecionar.setBounds(new Rectangle(275, 1, 110, 25));
			btnSelecionar.setText("Selecionar");
			
			btnSelecionar.addActionListener
			(
				new java.awt.event.ActionListener() 
				{
					public void actionPerformed(java.awt.event.ActionEvent e) 
					{
						try
						{
							if(getProprietario() != null)
							{
								getProprietario().setObjeto(obterSelecionado());
							}
							
							dispose();
						}
						catch(Exception ex)
						{
							new ExceptionSistema(ex);
						}
					}
				}
			);
		}
		
		return btnSelecionar;
	}

	/**
	 * This method initializes btnCancelar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private Botao getBtnCancelar() 
	{
		if (btnCancelar == null) 
		{
			btnCancelar = new Botao();
			btnCancelar.setBounds(new Rectangle(385, 1, 102, 25));
			btnCancelar.setText("Cancelar");
			
			btnCancelar.addActionListener
			(
				new java.awt.event.ActionListener() 
				{
					public void actionPerformed(java.awt.event.ActionEvent e) 
					{
						dispose();
					}
				}
			);
		}
		
		return btnCancelar;
	}

	public IObjetoSistema getObjeto() 
	{
		return objeto;
	}

	public void setObjeto(IObjetoSistema objeto) 
	{
		this.objeto = objeto;
	}

	public IObjetoSistema obterSelecionado() throws Exception
	{
		int linhasSelecionadas = gridPesquisa.getSelectedRowCount(); 
		IObjetoSistema objeto = null;
		
		if (linhasSelecionadas == 1)
		{
			objeto = (IObjetoSistema)gridPesquisa.getObjetoCorrente();
		}
		else
		if (linhasSelecionadas < 1)
			throw new Exception(Menssagens.selecaoItem);
		else
			throw new Exception(Menssagens.selecaoUnica);
		
		return objeto;
	}
	
	private void preencheGrid() throws Exception
	{
		getGridPesquisa().setDados(getListaObjetos());
		getGridPesquisa().setColunas(getFormatoGrid());
		getGridPesquisa().bind();
		
	}
	
	private void pesquisar() throws Exception
	{
		IObjetoSistema objeto = getObjeto();
		String pesquisa = " 1 = 1 AND UPPER(" + getCampoPesquisa() + ") LIKE '%" + getTxtCriterio().getText() + "%'";
		
		if(!getFiltro().equals(""))
			pesquisa += getFiltro();
		
		this.listaObjetos = new ArrayList<IObjetoSistema>();
		
		for(Object objetoLista : objeto.obterTodosPorFiltro(pesquisa))
		{
			listaObjetos.add((IObjetoSistema)objetoLista);
		}
		
		preencheGrid();
		
		getGridPesquisa().requestFocus();
	}

	public ArrayList<IObjetoSistema> getListaObjetos() 
	{
		if (listaObjetos == null)
			listaObjetos = new ArrayList<IObjetoSistema>();
		
		return listaObjetos;
	}

	public void setListaObjetos(ArrayList<IObjetoSistema> listaObjetos) 
	{
		this.listaObjetos = listaObjetos;
	}

	public String getCampoPesquisa() 
	{
		return campoPesquisa;
	}

	public void setCampoPesquisa(String campoPesquisa) 
	{
		this.campoPesquisa = campoPesquisa;
	}

	public ArrayList<String[]> getFormatoGrid() 
	{
		return formatoGrid;
	}

	public void setFormatoGrid(ArrayList<String[]> formatoGrid) 
	{
		this.formatoGrid = formatoGrid;
	}
	
	private Rotulo getLblCriterio()
	{
		if (lblCriterio == null)
		{
			lblCriterio = new Rotulo();
			lblCriterio.setBounds(new Rectangle(8, 11, 471, 16));
			lblCriterio.setText("JLabel");
		}
		
		return lblCriterio;
	}

	public CampoPopupLocalizador getProprietario() 
	{
		return proprietario;
	}

	public String getFiltro() 
	{
		return filtro;
	}

	public void setFiltro(String filtro) 
	{
		this.filtro = filtro;
	}
}  //  @jve:decl-index=0:visual-constraint="10,10"
